package com.loong.android.http.request;

import com.loong.android.http.RequestEvent;
import com.loong.android.http.response.FileResponse;
import com.lzy.okgo.callback.FileCallback;
import com.lzy.okgo.model.Progress;
import com.lzy.okgo.model.Response;
import com.lzy.okgo.request.GetRequest;
import com.lzy.okgo.request.base.Request;

import java.io.File;

/**
 * 文件请求类(文件下载)
 */
public class FileGetRequest extends GetRequest<File> {

    /**
     * 构造方法，初始化请求URL
     * @param url 请求的URL
     */
    public FileGetRequest(String url) {
        super(url);
    }

    /**
     * 创建一个文件回调对象，用于处理文件下载过程中的各种事件
     * @param dir 文件下载后存储的目录路径
     * @param fileName 文件下载后存储的文件名
     * @param callback 下载过程中的事件回调
     * @return 返回一个定制化的FileCallback对象
     */
    private FileCallback listen(String dir, String fileName, RequestEvent.DownloadEvent callback) {
        final FileGetRequest req = this;
        return new FileCallback(dir, fileName) {

            @Override
            public void onStart(Request<File, ? extends Request> request) {
                super.onStart(request);
                if(callback != null) callback.onStart(req);
            }

            @Override
            public void onSuccess(Response<java.io.File> response) {
                if(callback != null) callback.onSuccess(new FileResponse(response));
            }

            @Override
            public void onError(Response<java.io.File> response) {
                super.onError(response);
                if(callback != null) callback.onError(new FileResponse(response));
            }

            @Override
            public void downloadProgress(Progress progress) {
                super.downloadProgress(progress);
                if(callback != null) callback.onDownloadProgress(progress);
            }

            @Override
            public void onCacheSuccess(Response<java.io.File> response) {
                super.onCacheSuccess(response);
                if(callback != null) callback.onCacheSuccess(new FileResponse(response));
            }

            @Override
            public void onFinish() {
                super.onFinish();
                if(callback != null) callback.onFinish();
            }
        };
    }

    /**
     * 设置事件回调
     * @param dir 下载文件存储的目录路径
     * @param fileName 下载文件存储的文件名称，如：test.zip
     * @param callback 事件回调
     */
    public FileGetRequest setCallback(String dir, String fileName, RequestEvent.DownloadEvent callback) {
        super.setCallback(listen(dir, fileName, callback));
        return this;
    }

    /**
     * 提交请求
     * @param dir 下载文件存储的目录路径
     * @param fileName 下载文件存储的文件名称，如：test.zip
     * @param callback 事件回调
     */
    public FileGetRequest execute(String dir, String fileName, RequestEvent.DownloadEvent callback) {
        super.execute(listen(dir, fileName, callback));
        return this;
    }
}
